// /**
//  * @file Visualization.h
//  * @brief 可视化类
//  * @details 使用OpenCV显示地图、路径规划过程和结果
//  */

// #ifndef VISUALIZATION_H
// #define VISUALIZATION_H

// #include "core/Types.h"
// #include "core/Map.h"
// #include <memory>
// #include <functional>

// // OpenCV头文件
// #include <opencv2/opencv.hpp>

// namespace PathPlanning
// {
// class Visualizer
// {
// public:
//     Visualizer(std::shared_ptr<Map> map);
//     ~Visualizer();

//     /**
//      * @brief 初始化显示窗口
//      */
//     bool initialize(int windowWidth = 800, int windowHeight = 600);

//     /**
//      * @brief 显示路径规划结果
//      */
//     void displayResult(const PlanningResult& result, const Point& start, const Point& goal,
//                        const std::string& plannerName = "");

//     /**
//      * @brief 实时更新显示 (用于显示搜索过程)
//      */
//     void updateDisplay(const PlanningResult& partialResult, const Point& start, const Point& goal,
//                        const std::string& plannerName = "");

//     /**
//      * @brief 等待用户按键
//      */
//     void waitKey(int delay = 0);

//     /**
//      * @brief 设置鼠标回调函数
//      */
//     void setMouseCallback(std::function<void(int, int, int, int, void*)> callback);

//     /**
//      * @brief 世界坐标转图像坐标
//      */
//     cv::Point worldToImage(const Point& worldPoint) const;

//     /**
//      * @brief 图像坐标转世界坐标
//      */
//     Point imageToWorld(const cv::Point& imagePoint) const;

//     /**
//      * @brief 清理资源
//      */
//     void cleanup();

// private:
//     std::shared_ptr<Map> map_;
//     cv::Mat              displayImage_;
//     std::string          windowName_   = "Path Planning";
//     int                  windowWidth_  = 800;
//     int                  windowHeight_ = 600;
//     double               scaleX_       = 1.0;
//     double               scaleY_       = 1.0;

//     /**
//      * @brief 绘制地图
//      */
//     void drawMap();

//     /**
//      * @brief 绘制路径
//      */
//     void drawPath(const std::vector<Pose>& path, const cv::Scalar& color, int thickness = 2);

//     /**
//      * @brief 绘制节点
//      */
//     void drawNodes(const std::vector<Pose>& nodes, const cv::Scalar& color, int radius = 1);

//     /**
//      * @brief 绘制起点和终点
//      */
//     void drawStartGoal(const Point& start, const Point& goal);

//     /**
//      * @brief 绘制文本信息
//      */
//     void drawTextInfo(const PlanningResult& result, const std::string& plannerName);
// };

// } // namespace PathPlanning

// #endif

/**
 * @file Visualization.h
 * @brief 可视化类 - 修复版本
 */

#ifndef VISUALIZATION_H
#define VISUALIZATION_H

#include "Types.h"
#include "Map.h"
#include <memory>
#include <functional>

// OpenCV头文件
#include <opencv2/opencv.hpp>

namespace PathPlanning
{
class Visualizer
{
public:
    Visualizer(std::shared_ptr<Map> map);
    ~Visualizer();

    /**
     * @brief 初始化显示窗口
     */
    bool initialize(int windowWidth = 800, int windowHeight = 600);

    /**
     * @brief 显示路径规划结果
     */
    void displayResult(const PlanningResult& result, const Point& start, const Point& goal,
                       const std::string& plannerName = "");

    /**
     * @brief 实时更新显示 (用于显示搜索过程)
     */
    void updateDisplay(const PlanningResult& partialResult, const Point& start, const Point& goal,
                       const std::string& plannerName = "");

    /**
     * @brief 等待用户按键
     */
    void waitKey(int delay = 0);

    /**
     * @brief 设置鼠标回调函数
     */
    void setMouseCallback(std::function<void(int, int, int, int, void*)> callback);

    /**
     * @brief 世界坐标转图像坐标
     */
    cv::Point worldToImage(const Point& worldPoint) const;

    /**
     * @brief 图像坐标转世界坐标
     */
    Point imageToWorld(const cv::Point& imagePoint) const;

    /**
     * @brief 获取地图指针
     */
    std::shared_ptr<Map> getMap() const
    {
        return map_;
    }

    /**
     * @brief 清理资源
     */
    void cleanup();

private:
    std::shared_ptr<Map> map_;
    cv::Mat              displayImage_;
    std::string          windowName_   = "Path Planning";
    int                  windowWidth_  = 800;
    int                  windowHeight_ = 600;
    double               scaleX_       = 1.0;
    double               scaleY_       = 1.0;

    /**
     * @brief 绘制地图
     */
    void drawMap();

    /**
     * @brief 绘制路径
     */
    void drawPath(const std::vector<Pose>& path, const cv::Scalar& color, int thickness = 2);

    /**
     * @brief 绘制节点
     */
    void drawNodes(const std::vector<Pose>& nodes, const cv::Scalar& color, int radius = 1);

    /**
     * @brief 绘制起点和终点
     */
    void drawStartGoal(const Point& start, const Point& goal);

    /**
     * @brief 绘制文本信息
     */
    void drawTextInfo(const PlanningResult& result, const std::string& plannerName);
};

} // namespace PathPlanning

#endif